package com.iwhalecloud.bss.kite.cucc.service.attr.handler;

import com.google.common.collect.Lists;
import com.iwhalecloud.bss.kite.common.util.KiteListUtils;
import com.iwhalecloud.bss.kite.common.util.KiteStringUtils;
import com.iwhalecloud.bss.kite.dataservice.cache.DcPublicCache;
import com.iwhalecloud.bss.kite.manager.api.IQuerySceneInstService;
import com.iwhalecloud.bss.kite.manager.inst.KiteAttr;
import com.iwhalecloud.bss.kite.manager.inst.KiteInst;
import com.iwhalecloud.bss.kite.manager.inst.KiteProdInst;
import com.iwhalecloud.bss.kite.manager.inst.KiteProdInstFunc;
import com.iwhalecloud.bss.kite.service.attr.AttrData;
import com.iwhalecloud.bss.kite.service.attr.handler.AbstractAttrHandler;
import com.iwhalecloud.bss.kite.service.scene.attr.OperateInstAttrService;
import com.ztesoft.bss.common.exception.BssException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 套内用量属性处理器
 */
public class GeneralProdTypeAttrHandler extends AbstractAttrHandler<KiteInst, AttrData> {
    @Autowired
    private OperateInstAttrService operateInstAttrService;
    @Autowired
    private IQuerySceneInstService querySceneInstService;

    @Override
    public void before(KiteAttr attr, KiteInst inst, String value, AttrData data) {
        if (KiteStringUtils.isNotEmpty(value)) {
            List<KiteProdInst> kiteProdInstList = querySceneInstService.listProdInsts(data.getSceneInstId());
            List<KiteProdInst> prodInstList = Lists.newArrayList();
            String zfStr = DcPublicCache.getCodea("202012170001","zf_base_inst");
            if (KiteListUtils.isNotEmpty(kiteProdInstList)) {
                kiteProdInstList.stream().forEach(prodInst -> {
                    List<KiteProdInstFunc> kiteProdInstFuncs = querySceneInstService
                        .listProdInstFuncs(data.getCustId(), prodInst.getProdInstId());
                    if (KiteListUtils.isNotEmpty(kiteProdInstFuncs)) {
                        kiteProdInstFuncs.stream().forEach(kiteProdInstFunc -> {
                            if (KiteStringUtils.indexOf(zfStr, kiteProdInstFunc.getProdId())>-1) {
                                prodInstList.add(prodInst);
                            }
                        });
                    }
                });
            }
            if (KiteListUtils.isNotEmpty(prodInstList)) {
                String[] str = zfStr.split("/");
                for (KiteProdInst kiteProdInst : prodInstList) {
                    List<KiteProdInstFunc> kiteProdInstFuncList = new ArrayList<>();
                    for(String prodId : str){
                        kiteProdInstFuncList = querySceneInstService
                            .listProdInstFuncsByProdId(data.getCustId(), kiteProdInst.getProdInstId(), prodId);
                        if(KiteListUtils.isNotEmpty(kiteProdInstFuncList)){
                            kiteProdInstFuncList.stream().forEach(instFunc ->{
                                KiteAttr kiteAttr = instFunc.getAttr("200001880");
                                if(!ObjectUtils.isEmpty(kiteAttr)){
                                    //实例产品类型
                                    String kiteAttrValue = kiteAttr.getValue();
                                    if(!KiteStringUtils.isEmpty(kiteAttrValue) && !KiteStringUtils.equals(instFunc.getInstId(),inst.getInstId())){
                                        if(KiteStringUtils.equals("100000166",kiteAttrValue) && !KiteStringUtils.equals("100000166",value)){
                                            BssException.throwOut("资费计划新增校验","资费计划新增校验","资费计划已存在"+kiteAttr.getValueDesc()+"产品类型，该类型不允许多选，请检查");
                                        }
                                        if(!KiteStringUtils.equals("100000166",kiteAttrValue)){
                                            BssException.throwOut("资费计划新增校验","资费计划新增校验","资费计划已存在"+kiteAttr.getValueDesc()+"产品类型，该类型不允许多选，请检查");
                                        }
                                    }
                                }
                            });
                        }
                    }
                }
            }
        }
    }

}
